<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 闭包会产生的问题：内存泄漏
        function count() {
            let i = 0
            return function () {
                i++
                console.log(`调用了${i}次`)
            }
        }
        const fn = count()
        // ==> 
        // const fn = function(){
        //         i++
        //         console.log(`调用了${i}次`)
        //     }
        fn()

        // 标记清除法 ： 从一组根元素开始，
        // 或者说从全局作用域出发，找到了这个i变量，能访问到这个i变量，把它标记为活动对象
        // 所以不会GC程序清理掉

        // 本来，我们调用fn()后，按理说， i是函数count里面的变量，局部变量，执行完后应该销毁
        // 但是现在，因为 i 变量和内部的函数function形成了闭包。i变量没有被销毁，所以，造成了内存泄漏。

        // 有一个变量应该被回收但是没有被回收  内存泄漏

        /*==================================  可以理解记忆  ====================================*/
        // 闭包的特性（作用）
        // ==> 通过闭包，可以让外部访问到函数内部的变量，同时实现数据的私有化
        // ==> 闭包产生的问题：内存泄漏

        // 闭包的实际应用：
        // 节流 throttle  减少事件执行的频率
        // 防抖 debounce  你先抖动着，什么时候停了，我再执行事件
    </script>
</body>

</html>